Docker不香吗,为啥还要K8s?
The following article is from 51CTO技术栈 Author jartto
在 Docker 的使用过程中,其实遗留了一个大问题。Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。
图片来自 Pexels
这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营。
关于 K8s 的基本概念我们将会围绕如下七点展开:
Docker 的管理痛点
什么是 K8s?
云架构 & 云原生
K8s 架构原理
K8s 核心组件
K8s 的服务注册与发现
关键问题
Docker 的管理痛点
如果想要将 Docker 应用于庞大的业务实现,是存在困难的编排、管理和调度问题。
于是,我们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。
Google 在 2014 年开源了 Kubernetes 项目,建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。
K8s 是 Kubernetes 的缩写,用 8 替代了 「ubernete」,下文我们将使用简称。
什么是 K8s ?
K8s 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
K8s 拥有一个庞大且快速增长的生态系统。K8s 的服务、支持和工具广泛可用。
通过 K8s 我们可以:
快速部署应用
快速扩展应用
无缝对接新的应用功能
节省资源,优化硬件资源的使用
K8s 有如下特点:
可移植:支持公有云,私有云,混合云,多重云 multi-cloud。
可扩展:模块化,插件化,可挂载,可组合。
自动化:自动部署,自动重启,自动复制,自动伸缩/扩展。
云架构 & 云原生
云就是使用容器构建的一套服务集群网络,云由很多的大量容器构成。K8s 就是用来管理云中的容器。
②常见几类云架构
常见几类云架构如上图所示:
On-Premises(本地部署)。
IaaS(基础设施即服务):用户:租用(购买|分配权限)云主机,用户不需要考虑网络,DNS,硬件环境方面的问题;运营商:提供网络,存储,DNS,这样服务就叫做基础设施服务。
PaaS(平台即服务):MySQL/ES/MQ/...
SaaS(软件即服务):钉钉,财务管理。
Serverless:无服务,不需要服务器。站在用户的角度考虑问题,用户只需要使用云服务器即可,在云服务器所在的基础环境,软件环境都不需要用户关心。
如果觉得不好理解,推荐阅读这篇文章:如何通俗解释 IaaS、PaaS、SaaS 的区别:
https://www.zhihu.com/question/21641778/answer/62523535
为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样的方案叫做云原生。
容器化,所有服务都必须部署在容器中
微服务,Web 服务架构式服务架构
CI/CD
DevOps
K8s 架构原理
apiserver 即 K8s 网关,所有的指令请求都必须要经过 apiserver。
Scheduler 调度器,使用调度算法,把请求资源调度到某一个 Node 节点。
Controller 控制器,维护 K8s 资源对象。
etcd 存储资源对象。
Kubelet 在每一个 Node 节点都存在一份,在 Node 节点上的资源操作指令由 Kubelet 来执行。
Kube-proxy 代理服务,处理服务间负载均衡。
Pod 是 K8s 管理的基本单元(最小单元),Pod 内部是容器,K8s 不直接管理容器,而是管理 Pod。
Docker 运行容器的基础环境,容器引擎。
Fluentd 日志收集服务。
K8s 核心组件
一个 Master 有一群 Node 节点与之对应。
Master 节点不存储容器,只负责调度、网管、控制器、资源对象存储。
容器的存储在 Node 节点,容器是存储在 Pod 内部的)。
Pod 内部可以有一个容器,或者多个容器。
Kubelet 负责本地 Pod 的维护。
Kube-proxy 负责负载均衡,在多个 Pod 之间来做负载均衡。
Pod 也是一个容器,这个容器中装的是 Docker 创建的容器,Pod 用来封装容器的一个容器,Pod 是一个虚拟化分组。
Pod 相当于独立主机,可以封装一个或者多个容器。
Pod 内部容器创建之前,必须先创建 Pause 容器。
服务容器之间访问 localhost ,相当于访问本地服务一样,性能非常高。
ReplicationController 副本控制器:单选。
ReplicaSet 副本控制器:单选,复合选择。
selector:
app = web
Release = stable
服务部署结构模型
滚动更新
ReplicaSet 不支持滚动更新,Deployment 对象支持滚动更新,通常和 ReplicaSet 一起使用。
Deployment 管理 ReplicaSet,RS 重新建立新的 RS,创建新的 Pod。
容器是生命周期的,一旦宕机,数据丢失
Pod 部署,Pod 有生命周期,数据丢失
有实时的数据需要存储。
有状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,如果集群网络无法使用。
没有实时的数据需要存储。
无状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,对集群服务没有任何影响。
部署模型
有状态服务
K8s 的服务注册与发现
Pod 相当于一个容器,Pod 有独立 IP 地址,也有自己的 Hostname,利用 Namespace 进行资源隔离,独立沙箱环境。
Pod 内部封装的是容器,可以封装一个,或者多个容器(通常是一组相关的容器)。
Pod 有自己独立的 IP 地址。
Pod 内部容器之间访问采用 Localhost 访问。
简单来说,Service 资源对象包括如下三部分:
Pod IP:Pod 的 IP 地址。
Node IP:物理机 IP 地址。
Cluster IP:虚拟 IP ,是由 K8s 抽象出的 Service 对象,这个 Service 对象就是一个 VIP 的资源对象。
Service 和 Pod 都是一个进程,Service 也不能对外网提供服务。
Service 和 Pod 之间可以直接进行通信,它们的通信属于局域网通信。
把请求交给 Service 后,Service 使用 iptable,ipvs 做数据包的分发。
不同的业务有不同的 Service。
Service 和 Pod 通过标签选择器进行关联。
selector:
app=x 选择一组订单的服务 pod ,创建一个 service;
通过 endpoints 存放一组 pod ip;
关键问题
自动化运维平台,创业型公司,中小型企业,使用 K8s 构建一套自动化运维平台,自动维护服务数量,保持服务永远和预期的数据保持一致性,让服务可以永远提供服务。这样最直接的好处就是降本增效。
充分利用服务器资源,互联网企业,有很多服务器资源「物理机」,为了充分利用服务器资源,使用 K8s 构建私有云环境,项目运行在云。这在大型互联网公司尤为重要。
服务的无缝迁移,项目开发中,产品需求不停的迭代,更新产品。这就意味着项目不停的发布新的版本,而 K8s 可以实现项目从开发到生产无缝迁移。
推荐阅读
mall-swarm 微服务电商项目发布重大更新,打造Spring Cloud最佳实践! 为什么阿里巴巴禁止使用Apache BeanUtils进行属性拷贝? 10个解放双手的 IDEA 插件,少些冤枉代码! Docker服务开放了这个端口,服务器分分钟变肉机! Mall 电商实战项目发布重大更新,全面支持SpringBoot 2.3.0 ! 秒杀商品超卖事故:Redis分布式锁请慎用! 被我用烂的DEBUG调试技巧,专治各种搜索不到的问题! 我扒了半天源码,终于找到了Oauth2自定义处理结果的最佳方案! 一个不容错过的Spring Cloud实战项目! 我的Github开源项目,从0到20000 Star!
欢迎关注,点个在看